#
# @lc app=leetcode.cn id=2105 lang=python3
#
# [2105] 给植物浇水 II
#
from typing import List

"""
本题使用双指针即可，难点在逻辑判断
当 left < right 时：
  A, B 均要浇水，在浇水之前判断壶当前水量是否小于植物所需水量，小于时需要补满水壶
  这样，在浇水动作执行之前就使得壶内水量恒大于植物所需水量
  浇水动作中，壶剩余的水量为 pot-plants[i] ，并且使指针向中间靠一步
当 left = right 时：
  从思路上讲，需要先判断两者水量是否相同，相同则由 A 来浇水，不同则由剩余水量大的一方进行浇水
  但实现时会发现，因为计算的是灌满水壶的次数，所以无论是谁去执行浇水，只要两个水壶中剩余水量最大的水壶也不够，就必须执行装满水的动作
  并且此时已到达数组的最中央，所以在 res+=1 之后即可返回最终结果
"""
# @lc code=start

class Solution:
    def minimumRefill(self, plants: List[int], capacityA: int, capacityB: int) -> int:
        potA, potB = capacityA, capacityB
        left, right = 0, len(plants)-1
        res = 0

        while left < right:
            if potA < plants[left]:
                potA = capacityA
                res += 1
            potA -= plants[left]
            left += 1

            if potB < plants[right]:
                potB = capacityB
                res += 1
            potB -= plants[right]
            right -= 1
              
        if left == right and max(potA, potB) < plants[left]:
            res += 1

        return res 
                

# @lc code=end

print(Solution.minimumRefill(Solution, [1,2,4,4,5], 6, 5))